/**
 * 
 */
package com.eagle.security.dao;

import java.sql.Timestamp;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;

import com.eagle.security.entries.User;
import com.eagle.security.entries.UserExtendInfo;


/**
 * @author 
 * 
 */
public interface UserGroupManager
{
    /**
     * 创建新用户
     * 
     * @param user
     *            使用cn.antvision.spring.security.entries.User.User(String, String, String,
     *            boolean)生成对象
     */
    public void createUser(final UserDetails user);

    /**
     * 用户名是否存在
     * 
     * @param username
     *            用户名
     * @return 指定用户是否存在
     */
    public boolean userExists(String username);

    /**
     * 判断用户名和密码是否正确
     * 
     * @param username
     *            用户名
     * @param password
     *            密码
     * @return true：正确，false：错误
     */
    public boolean verifyUserPassword(String username, String password);

    /**
     * 删除用户
     * 
     * @param username
     *            用户名
     */
    public void deleteUser(String username);

    /**
     * 验证当前用户原始密码进行修改密码
     * 
     * @param oldPassword
     *            当前登录用户的原始密码
     * @param newPassword
     *            当前用户的新密码
     * @return 返回true 修改成功；false 返回原始密码错误
     * @throws AuthenticationException
     *             修改错误，当前用户尚未登录或者当前登录用户的原始密码不正确
     */
    public boolean changePasswordByPassword(String oldPassword, String newPassword) throws AuthenticationException;

    /**
     * 当前登录用户修改密码
     * 
     * @param newPassword
     *            当前用户的新密码
     * @return 返回true 修改成功；false 返回原始密码错误
     * @throws AuthenticationException
     *             修改错误
     */
    public boolean changePassword(String newPassword) throws AuthenticationException;

    /**
     * 获取指定用户名的信息
     * 
     * @param username
     *            用户名
     * @return cn.antvision.spring.security.entries.User
     */
    public User findUser(String username);

    /**
     * 更新用户信息,只对用户昵称,账号启用状态,账号开始时间,账号结束使用时间做更新操作
     * @param params Map<String, Object> 键值对对应User对象中的属性名称和属性值
     */
    public void updateUser(String username, Map<String, Object> params);
    
    /**
     * 修改用户额外信息
     * 
     * @param username
     *            用户名
     * @param extendInfo
     *            UserExtendInfo
     */
    public void updateUserExtendInfo(final String username, final UserExtendInfo extendInfo);

    /**
     * 修改制定用户密码
     */
    public void changePasswordByUsername(final String username, final String newPassword) throws AuthenticationException;

    /**
     * 创建组
     * 
     * @param groupName
     *            角色组名称
     */
    public void createGroup(String groupName);

    /**
     * 角色组是否存在
     * 
     * @param groupName
     *            角色组名称
     * @return 指定角色组是否存在
     */
    public boolean groupExists(String groupName);

    /**
     * 删除角色组
     * 
     * @param groupName
     *            角色组名称
     */
    public void deleteGroup(String groupName);

    /**
     * 指定用户添加角色组
     * 
     * @param username
     *            用户名
     * @param groupName
     *            角色组名称
     */
    public void addUserToGroup(String username, String groupName);

    /**
     * 重命名角色组名称
     * 
     * @param oldName
     *            原始角色组名称
     * @param newName
     *            新角色组名称
     */
    public void renameGroup(String oldName, String newName);

    /**
     * 将用户从指定角色组中移除
     * 
     * @param username
     *            用户名
     * @param groupName
     *            角色组名称
     */
    public void removeUserFromGroup(String username, String groupName);

    /**
     * 设置用户所在的角色组
     * 
     * @param username
     *            用户名
     * @param groupNames
     *            可为空
     */
    public void setUserGroups(String username, String... groupNames);

    /**
     * 设置用户所在的角色组
     * 
     * @param username
     *            用户名
     * @param groupNames
     *            角色组名 可为空
     */
    public void setUserGroups(String username, Collection<String> groupNames);

    /**
     * 设置角色组的权限
     * 
     * @param groupName
     *            角色组名称
     * @param roles
     *            零个或多个角色名，可为空
     */
    public void setGroupRoles(String groupName, String... roles);

    /**
     * 设置角色组的权限
     * 
     * @param groupName
     *            角色组名称
     * @param roles
     *            角色名称集合， 可为空
     */
    public void setGroupRoles(String groupName, Collection<String> roles);

    /**
     * 查找用户所在的所有角色组名称
     * 
     * @param username
     *            用户名
     * @return 指定用户的所有角色组名称集合
     */
    public List<String> loadGroupsByUsername(String username);

    /**
     * 获取所有角色组名称
     * 
     * @return 所有角色组名称集合
     */
    public List<String> findAllGroups();

    /**
     * 获取指定角色组中的所有用户
     * 
     * @param groupName
     *            角色组名称
     * @return 指定角色组中的所有用户名集合
     */
    public List<String> findUsersInGroup(String groupName);

    /**
     * 用户是否在角色组中
     * 
     * @param username
     *            用户名
     * @param groupName
     *            角色组名
     * @return 指定用户是否在指定角色组
     */
    public boolean isUserInGroup(String username, String groupName);

    /**
     * 查找用户
     * 
     * @param start
     *            开始行
     * @param end
     *            结束行
     * @param where
     *            条件语句
     * @param orderBy
     *            排序语句
     * @param values
     *            语句中的参数值
     * @return 用户集合
     */
    public List<User> findUsers(int start, int end, String where, String orderBy, Object... values);

    /**
     * 获取用户总数
     * 
     * @return 用户总数
     */
    int getUserTotal();

    /**
     * 获取指定权限组的权限列表
     * 
     * @param groupName
     *            角色组名
     * @return 权限集合
     */
    Collection<String> findGroupRoles(String groupName);

    /**
     * 获取指定用户的关于本身的权限
     * 
     * @param username
     * @return 权限集合
     */
    Collection<String> loadUserRolesByUsername(String username);

    /**
     * 获取指定用户的关于角色组的所有权限
     * 
     * @param username
     *            用户名
     * @return 权限集合
     */
    Collection<String> loadGroupRolesByUsername(String username);

    /**
     * 设置用户本身的权限
     * 
     * @param username
     *            用户名
     * @param roles
     *            角色名
     */
    void setUserRoles(String username, Collection<String> roles);

    /**
     * 设置用户本身的权限
     * 
     * @param username
     * @param roles
     *            角色名
     */
    void setUserRoles(String username, String[] roles);
}
